/*
 * GraficoTorta.cpp
 *
 *  Created on: 09/06/2012
 *      Author: sebastian
 */

#include "GraficoTorta.h"
#include "stdlib.h"
#include "gtkmm.h"
#include "common.h"

GraficoTorta::GraficoTorta() {
	total = 0;
}

GraficoTorta::~GraficoTorta() {
	//cairo_destroy (cr);
	//cairo_surface_destroy (surface);
}

void GraficoTorta::dibujarPorcion(const Cairo::RefPtr<Cairo::Context>& cr, porcion valorNuevo, float valorAnterior, int i, float pos_inicial_x, float pos_inicial_y, float radio) {
	float valorNuevoNormalizado, valorAnteriorNormalizado;
	valorNuevoNormalizado = valorNuevo.valor / total;
	valorAnteriorNormalizado = valorAnterior / total;
	cr->arc(pos_inicial_x, pos_inicial_y, radio, 2 * valorAnteriorNormalizado * M_PI, 2 * (valorAnteriorNormalizado + valorNuevoNormalizado) * M_PI);
	cr->set_source_rgb (valorNuevo.cRojo, valorNuevo.cVerde, valorNuevo.cAzul);
	cr->line_to(pos_inicial_x, pos_inicial_y);
	cr->move_to(pos_inicial_x, pos_inicial_y);
	cr->fill();

	float height = radio / 0.4;
	float font_size = height / 40;
	cr->set_font_size(font_size);
	cr->move_to(height/20, height/20 + i * 2 *font_size);	// posiciono cuadro

	cr->show_text(valorNuevo.nombre.c_str());
	cr->move_to(height/20 + font_size * 9, height/20 + i * 2 *font_size);
	cr->show_text(Auxiliar::float_to_dec(valorNuevo.valor));
	cr->stroke();
}

void GraficoTorta::dibujarPorcionInicial(const Cairo::RefPtr<Cairo::Context>& cr, porcion p, float pos_inicial_x, float pos_inicial_y, float radio) {

	cr->arc(pos_inicial_x, pos_inicial_y, radio, 0, 2 * (p.valor) / total * M_PI);
	cr->set_source_rgb(p.cRojo, p.cVerde, p.cAzul);
	cr->line_to(pos_inicial_x, pos_inicial_y);
	cr->line_to(pos_inicial_x + radio, pos_inicial_y);
	cr->fill();

	float height = radio / 0.4;
	float font_size = height / 40;
	cr->set_font_size (font_size);
	cr->move_to(height/20, height/20);
	cr->show_text(p.nombre.c_str());

	cr->move_to(height/20 + font_size * 9, height/20);
	cr->show_text(Auxiliar::float_to_dec(p.valor));

	cr->stroke();
}

void GraficoTorta::agregarValor(std::string n, float val) {
	porcion p;
	p.nombre = n;
	unsigned int cant = valores.size() + 1;
	//  colores
	float rojo = (cant % 4) / (cant)* 0.9;
	float verde = (cant % 3) * 0.6;
	float azul = (cant % 2) / (cant) * 0.9;
	p.valor = val;
	p.cRojo = rojo;
	p.cVerde = verde;
	p.cAzul = azul;
	total += p.valor;
	valores.push_back(p);
}


bool GraficoTorta::on_expose_event(GdkEventExpose* event) {
	Glib::RefPtr<Gdk::Window> win = get_window();
	if(win) {
		Gtk::Allocation alloc = get_allocation();

		const int width = alloc.get_width();
		const int height = alloc.get_height();
		int lesser = width;
		if(height < width)
			lesser = height;
		Cairo::RefPtr<Cairo::Context> cr = win->create_cairo_context();

		int x_center = width / 2;
		int y_center = height / 2;

		cr->rectangle(event->area.x, event->area.y, event->area.width, event->area.height);
		cr->clip();

		float radio = lesser * 0.3;
		std::list<porcion>::iterator it;
		it = valores.begin();
		porcion valorInicial = (*it);
		dibujarPorcionInicial(cr, valorInicial, x_center, y_center, radio);
		++it;
		int i = 1;
		float valorAnterior = valorInicial.valor;
		unsigned int maxSize = 0;
		for(; it != valores.end(); ++it) {
			dibujarPorcion(cr, (*it), valorAnterior, i, x_center, y_center, radio);
			valorAnterior += (*it).valor;
			if(((*it).nombre).size() > maxSize)
				maxSize = ((*it).nombre).size();
			++i;
		}
	cr->stroke();
	cr->set_source_rgb (0, 0, 0);

	float font_size = lesser / 30;

	cr->rectangle(0, 0, maxSize *1.5*font_size, valores.size() *font_size * 1.35);
	cr->stroke();
	}
	return true;
}

void agregarValor(std::string nombre, float valor) {

}
